package practica3;

import weka.attributeSelection.BestFirst;
import weka.attributeSelection.CfsSubsetEval;
import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.supervised.attribute.AttributeSelection;
import weka.filters.unsupervised.attribute.Discretize;
import weka.filters.unsupervised.attribute.Normalize;
import weka.filters.unsupervised.instance.Randomize;

/**Clase que contiene los diferentes metodos para el preproceso*/
public class Preprocess {
	

	public Preprocess() {}
	
	/**
	 * Metodo que baraja las instancias.
	 * @param pData Instancias a barajar
	 * @return Conjunto de instancias barajadas
	 * @throws Exception
	 */
	public Instances randomize(Instances pData) throws Exception{	
		
		Randomize filtroRandomize= new Randomize();
		filtroRandomize.setInputFormat(pData);
		
		return Filter.useFilter(pData, filtroRandomize);		
	}
	
	/**
	 * Metodo que normaliza los atributos.
	 * @param pData Instancias a normalizar
	 * @return Conjunto de instancias normalizadas
	 * @throws Exception
	 */
	public Instances normalize(Instances pData) throws Exception{
				
		Normalize n = new Normalize();
        n.setInputFormat(pData);
        
        return Normalize.useFilter(pData, n);
		
	}
	
	/**
	 * Metodo que hace seleccion de atributos de las instancias.
	 * @param pData Instancias de las que se hara la seleccion de atributos
	 * @return Conjunto instancias sin los atributos descartados 
	 * @throws Exception
	 */
	public Instances subsetSelection(Instances pData) throws Exception{
			
		AttributeSelection filter= new AttributeSelection();
		CfsSubsetEval eval = new CfsSubsetEval();
		BestFirst search=new BestFirst();
		filter.setEvaluator(eval);
		filter.setSearch(search);
		filter.setInputFormat(pData);
			
		return Filter.useFilter(pData, filter);
	}
	
	/**
	 * Metodo que discretiza las instancias. 
	 * @param pData Instancias a discretizar 
	 * @return Conjunto de instancias discretizadas
	 * @throws Exception
	 */
	public Instances discretize(Instances pData) throws Exception{

		Discretize filter= new Discretize();
		filter.setInputFormat(pData);
       
		return Discretize.useFilter(pData, filter);

	}
}
